package com.ikas.autumn.iec104.module.iec.apdunew.enums;

import lombok.Getter;

/**
 * 
* 限定词
* @author YDL
 */
public enum QualifiersEnum {

	/**
	 *  总召唤限定词
	 */
	GENERAL_CALL_QUALIFIERS(TypeIdentifierEnum.GENERAL_CALL, 0x20),
	
	/**
	 * 总召唤限定词 支持 老版的分组
	 */
	GENERAL_CALL_GROUPING_QUALIFIERS(TypeIdentifierEnum.GENERAL_CALL, 0x14),
	/**
	 * 复位进程限定词
	 */
	RESET_PROCESS_QUALIFIERS(TypeIdentifierEnum.RESET_PROCESS, 0x01),
	/**
	 *  初始化原因 当地电源合上
	 */
	LOCAL_CLOSE_UP_QUALIFIERS(TypeIdentifierEnum.INIT_END, 0x00),
	/**
	 * 初始化原因 当地手动复位
	 */
	LOCAL_MANUAL_RESET_QUALIFIERS(TypeIdentifierEnum.INIT_END, 0x01),
	/**
	 * 远方复位 
	 */
	DISTANCE_RESET_QUALIFIERS(TypeIdentifierEnum.INIT_END, 0x02),
	/**
	 * 品质描述词  遥测
	 */
	QUALITY_QUALIFIERS(null, 0x00),
	/**
	 * 设置命令限定词  选择预置参数 1000 0000
	 */
	PREFAB_PARAMETER_QUALIFIERS(null, 0x40),
	/**
	 * 设置命令限定词  执行激活参数
	 */
	ACTIVATION_PARAMETER_QUALIFIERS(null, 0x0F);

	@Getter
	private final byte value;
	@Getter
	private final TypeIdentifierEnum typeIdentifier;

	QualifiersEnum(TypeIdentifierEnum typeIdentifier, int value) {
		this.value = (byte) value;
		this.typeIdentifier = typeIdentifier;
	}


	/**
	 * 	根据传输类型和 限定词的关系返回 限定词的类型
	 * @param typeIdentifier TypeIdentifierEnum
	 * @param value value
	 * @return QualifiersEnum
	 */
	public static QualifiersEnum getQualifiersEnum(TypeIdentifierEnum typeIdentifier, byte value) {
		// 品质描述词和设置参数 限定词对应多个值 所以需要做特殊处理
		boolean qualityType = TypeIdentifierEnum.isQualityType(typeIdentifier);
		if (qualityType && QUALITY_QUALIFIERS.getValue() == value) {
			return QUALITY_QUALIFIERS;
		}else {
			return getQualifierByValue(typeIdentifier, value);
		}
	}

	private static QualifiersEnum getQualifierByValue(TypeIdentifierEnum typeIdentifier, byte value) {
		for (QualifiersEnum type : QualifiersEnum.values()) {
			if (type.getValue() == value && type.getTypeIdentifier() == typeIdentifier) {
				return type;
			}
		}
		return null;
	}
}
